Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
此題要求從一陣列中找出非成對出現的數字。由於兩個同樣的位元進行XOR運算後會得到0,任何位元與0進行XOR運算後的值都是原值,因此如果有一遮罩的 bit 都是0,則某數與其進行XOR運算後會保持原值。基於這個原理,將陣列中所有的值都進行XOR運算後,最後得到的數字即為此題所求。
class Solution {
public int singleNumber(int[] nums) {
int value=0;
for(int i=0;i<nums.length;i++){
value^=nums[i];
}
return value;
}
}
Java的位元運算有以下四種:
~ 0 1 0 1 運算元1
= 1 0 1 1 (~運算元1) – 回傳結果
0 0 1 1 運算元1
AND 1 0 0 1 運算元2
= 0 0 0 1 (運算元1 & 運算元2) – 回傳結果
0 0 1 1 運算元1
OR 1 0 0 1 運算元2
= 1 0 1 1 (運算元1 | 運算元2) – 回傳結果
0 0 1 1 運算元1
XOR 1 0 0 1 運算元2
= 1 0 1 0 (運算元1 ^ 運算元2) – 回傳結果
希望透過記錄解題的過程,可以對於資料結構及演算法等有更深一層的想法。
如有需訂正的地方歡迎告知,若有更好的解法也歡迎留言,謝謝。